

package modelos;

import java.lang.String;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;


public class MProducto{
	private Conexion conexion;
	private String Cod_Producto, Cod_Categoria, Desc_Producto, estatus;
	private double Precio_Producto;
    
    
    public MProducto(){    		
            super();
            conexion = new Conexion();
    }

    public boolean registrar(){
        conexion.abrirConexion();
        boolean sw = false;
        String sql="INSERT INTO Producto (Cod_Producto, Cod_Categoria, Desc_Producto, Precio_Producto, estatus ) VALUES(?,?,?,?,?)";
        try {
        	PreparedStatement stam = conexion.getConexion().prepareStatement(sql);
        	stam.setString(1, getCod_Producto());
            stam.setString(2, getCod_Categoria());
            stam.setString(3, getDesc_Producto().toLowerCase());
            stam.setDouble(4, getPrecio_Producto());
            stam.setString(5, getEstatus());
            stam.executeUpdate();
            sw = true;
        } catch (SQLException ex) {
            Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
        }
        conexion.cerrarConexion();
        return sw;
    }
    
/***************************************************************/
    
    public void registrarIngredientes(Vector<String> codigos,Vector<Double> cantidades){
        conexion.abrirConexion();
        for (int i = 0; i < cantidades.size(); i++){
            String sql="INSERT INTO ingredienteXProducto (Cod_Ingrediente, Cod_Producto, Cantidad_Ingrediente ) VALUES(?,?,?)";
            try {
            	PreparedStatement stam = conexion.getConexion().prepareStatement(sql);
                stam.setString(1, codigos.elementAt(i));
                stam.setString(2,getCod_Producto());
                stam.setDouble(3, cantidades.elementAt(i));
                stam.executeUpdate();
            } catch (SQLException ex) {
                Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        conexion.cerrarConexion();
    } 

  public Vector<MProducto> listar(){
    Vector<MProducto> v = new Vector<MProducto>();
    String sql="SELECT * FROM Producto WHERE estatus='A'";
    conexion.abrirConexion();
    try {
        ResultSet rs = conexion.getConexion().createStatement().executeQuery(sql);
        while (rs.next()){
            MProducto  i = new MProducto();
            i.setDesc_Producto(rs.getString("desc_producto"));
            i.setCod_Producto(rs.getString("cod_producto"));
            i.setPrecio_Producto(rs.getFloat("precio_producto"));
            i.setEstatus(rs.getString("estatus"));
            i.setCod_Categoria(rs.getString("cod_categoria"));
            v.add(i);
         }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String []> ingredientesMasUsados(boolean orden){
    Vector<String []> v = new Vector<String []>();
    String sql="SELECT cantidades , des_ingrediente , cod_ingrediente FROM  Ingrediente,(SELECT SUM(cantidad_ingrediente) AS cantidades,cod_ingrediente AS cod_suma FROM IngredientexProducto GROUP BY cod_ingrediente) Suma WHERE Ingrediente.cod_ingrediente=Suma.cod_suma ORDER BY cantidades ";
    if(orden)
        sql+= "asc";
    else
        sql+= "desc";
    conexion.abrirConexion();
    try {
        ResultSet rs = conexion.getConexion().createStatement().executeQuery(sql);   
        while (rs.next()){
            String [] s = new String [] {rs.getString(2), ""+rs.getDouble(1), ""+rs.getString(3)};
            v.add(s);
        }
  } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public Vector<String []> listarIngredientes(){
    Vector<String []> v = new Vector<String []>();
    conexion.abrirConexion();
    String sql="SELECT Ingrediente.des_ingrediente, IngredientexProducto.Cantidad_Ingrediente  FROM Ingrediente, Producto,IngredientexProducto where Ingrediente.estatus='A' AND Producto.estatus='A' AND Producto.cod_producto=IngredientexProducto.cod_producto AND Ingrediente.cod_ingrediente=IngredientexProducto.cod_ingrediente and Producto.cod_producto=?";
    try {
    	PreparedStatement stam = conexion.getConexion().prepareStatement(sql);
        stam.setString(1, getCod_Producto());
        ResultSet rs= stam.executeQuery();
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getDouble(2)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  
  public Vector<String []> listarVentas(boolean orden){
    Vector<String []> v = new Vector<String []>();
    String sql="SELECT desc_producto, (precio_producto*suma.cantidades), suma.cantidades, cod_producto FROM  Producto, (SELECT sum(ProductoXOrden.Cantidad_Prod) as cantidades, ProductoXOrden.cod_producto AS cod_suma FROM ProductoXOrden GROUP BY ProductoXOrden.cod_producto) suma WHERE suma.cod_suma=cod_producto AND estatus='A' ORDER BY(suma.cantidades,(precio_producto*suma.cantidades)) ";
    if(orden)
        sql+= "asc";
    else
        sql+= "desc";
    conexion.abrirConexion();   
    try{
        ResultSet rs= conexion.getConexion().createStatement().executeQuery(sql);
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getDouble(2), ""+rs.getDouble(3), rs.getString(4)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

   public boolean hayDisponibilidadIngredientes(int cantidad){
    Vector<MIngrediente> v = new Vector<MIngrediente>();
    Vector<Double> d = new Vector<Double>();
    String sql="SELECT Ingrediente.cod_ingrediente,IngredientexProducto.Cantidad_Ingrediente FROM  Ingrediente,IngredientexProducto,Producto WHERE Ingrediente.estatus='A' AND Producto.estatus='A' AND Ingrediente.cod_ingrediente=IngredientexProducto.cod_ingrediente AND Producto.cod_producto=IngredientexProducto.cod_producto AND Producto.cod_producto=?";
    conexion.abrirConexion();   
    try{
    	PreparedStatement stam = conexion.getConexion().prepareStatement(sql);
        stam.setString(1, getCod_Producto());
        ResultSet rs =stam.executeQuery();
        while(rs.next()){
            MIngrediente  i = new MIngrediente();
            i.setCod_Ingrediente(rs.getString(1));
            d.add(rs.getDouble(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(MIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     conexion.cerrarConexion();
     for (int i = 0; i < v.size(); i++)
         if(!(v.elementAt(i).hayDisponibilidad(d.elementAt(i)*cantidad))){
          return false;
         }
     return true;
  }

 public void actualizarStockIngredientes(){
	 Vector<MIngrediente> v = new Vector<MIngrediente>();
	    Vector<Double> d = new Vector<Double>();
	    String sql="SELECT Ingrediente.cod_ingrediente,IngredientexProducto.Cantidad_Ingrediente FROM  Ingrediente,IngredientexProducto,Producto WHERE Ingrediente.estatus='A' AND Producto.estatus='A' AND Ingrediente.cod_ingrediente=IngredientexProducto.cod_ingrediente AND Producto.cod_producto=IngredientexProducto.cod_producto AND Producto.cod_producto=?";
	    conexion.abrirConexion();   
	    try{
	    	PreparedStatement stam = conexion.getConexion().prepareStatement(sql);
	        stam.setString(1, getCod_Producto());
	        ResultSet rs =stam.executeQuery();
	        while(rs.next()){
	            MIngrediente  i = new MIngrediente();
	            i.setCod_Ingrediente(rs.getString(1));
	            d.add(rs.getDouble(2));
	            v.add(i);
	         }
	     } catch (SQLException ex) {
	            Logger.getLogger(MIngrediente.class.getName()).log(Level.SEVERE, null, ex);
	     }
     conexion.cerrarConexion();
     for (int i = 0; i < v.size(); i++){
         v.elementAt(i).consultar();
         v.elementAt(i).setDisponibilidad(v.elementAt(i).getDisponibilidad()-d.elementAt(i));
         v.elementAt(i).actualizar();
     }
  }

public String getCod_Producto() {
	return Cod_Producto;
}

public void setCod_Producto(String cod_Producto) {
	Cod_Producto = cod_Producto;
}

public String getCod_Categoria() {
	return Cod_Categoria;
}

public void setCod_Categoria(String cod_Categoria) {
	Cod_Categoria = cod_Categoria;
}

public String getDesc_Producto() {
	return Desc_Producto;
}

public void setDesc_Producto(String desc_Producto) {
	Desc_Producto = desc_Producto;
}

public String getEstatus() {
	return estatus;
}

public void setEstatus(String estatus) {
	this.estatus = estatus;
}

public double getPrecio_Producto() {
	return Precio_Producto;
}

public void setPrecio_Producto(double precio_Producto) {
	Precio_Producto = precio_Producto;
}

    



}
